class 小孩
{
    // public string 姓名 = "晓华";
    public string 姓名 { get { return "晓华"; } set { 姓名 = value; } }
    public int 年龄 = 23;
    public char 性别 = '男';

    public 小孩() { }

    public 小孩(string name, int age, char sex)
    {
        姓名 = name;
        年龄 = age;
        性别 = sex;
    }

    public override string ToString()
    {
        return $"姓名：{姓名}，年龄：{年龄}，性别：{性别}";
    }


}

class ref_out练习
{
    public static void 练习()
    {
        小孩 晓华 = new 小孩();
        System.Console.WriteLine(晓华.姓名);
        小孩 晓雅 = new 小孩("胡晓雅", 24, '女');
        ref练习(晓华);
        System.Console.WriteLine(晓华.ToString());
        ref练习(ref 晓雅);
        System.Console.WriteLine(晓雅.ToString());

        int[] array = { 23, 43, 121, 212 };
        int[] array2 = { 23, 43, 121, 212 };
        ref练习(array);
        System.Console.WriteLine(array[0]);
        ref练习(ref array2);
        System.Console.WriteLine(array2[0]);
    }

    static void ref练习(ref 小孩 娃)
    {
        娃 = new 小孩("张三", 55, '男');
        // System.Console.WriteLine(娃.ToString());
    }

    /// <summary>
    /// 使用 ref 标记的函数参数
    /// 在函数内部为值类型变量重新赋值
    /// 或为引用类型变量指向新内存
    /// 都会同步到函数外部定义的变量
    /// </summary>
    /// <param name="array"></param>
    static void ref练习(ref int[] array)
    {
        array = new int[] { 44, 654, 332 };
        // System.Console.WriteLine(array[0]);
    }

    static void ref练习(小孩 娃)
    {
        // 重新赋值不会影响在外部定义的引用类型变量
        娃 = new 小孩("张三", 55, '男');
        // System.Console.WriteLine(娃.ToString());
    }


    static void ref练习(int[] array)
    {
        // 重新赋值不会影响在外部定义的引用类型变量
        array = new int[] { 44, 654, 332 };
        // System.Console.WriteLine(array[0]);
    }
}